Luego de la exploración de los datos, en donde se trabajaron con los datos obtenidos en los cabildos auto convocados, que completaban 90804 observaciones de consultas individuales, se plantearon distintas hipótesis sobre estos datos. En este informe se detallan los resultados de los experimentos realizados y resultados obtenidos que se realizaron sobre los datos, en donde se procedió a utilizar distintas técnicas de aprendizaje no supervisado tales como clustering, K-means y reglas de asociación, en donde se analizaron sus respectivos resultados, y finalmente se agregan las conclusiones pertinentes a lo resultados evaluando si las hipótesis fueron correctas.
Las hipótesis que este trabajo busca probar son que:
*Existe una diferenciación entre los conceptos votados agrupados por grupo etario.
*Existe una diferenciación entre los conceptos votados agrupados por grupo etario.
*Existe relación entre la votación de grupos de conceptos, pero no sabemos cuáles.
La métodología de trabajo consistió en una parte de Exploración de Datos para realizar una exploración preliminar y distintos experimentos que buscaban confirmar o refutar dichas hipótesis. Estos son:
*Reducción de Dimensionalidad: donde se verificó si los datos tenían cierta estructura
*Clustering: para buscar realciones entre grupos de concepto.
*Reglas de asociación: en donde primero se realizó un analisis por grupo etario, para lo cual se dividió en 5 grupos de edades distintos, en donde el primer grupo estaba conformado por personas de hasta 19 años, y el último por personas sobre los 59 años de edad. Luego, se realizarón reglas de asociación por zona geográfica, en donde primero se realizó por regiones, y finalmente se analizó de manera particular la región metropolitana dividiendo esta región en comunas, con el fin de encontrar posibles reglas diferenciadoras de cada zona y comuna
En la siguiente tabla muestra los promedios porcentuales de votación de los conceptos más votados por region. La varianza, en la mayoría de los casos, es en torno al $10\%$ o menor. Pero en el caso de Descentralización aumenta en torno al $15\%$.
El concepto más votado de "Justicia" con alrededor del $46\%$ del total, por lo que parece ser el concepto de mayor concenso entre los participantes. Le sigue Descentralización, Igualdad, Democracia y Respeto/convervacion de la naturaleza o medio ambiente, todos ellos sobre el $30\%$ de las votaciones.
from IPython.display import Image
i = Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/conceptos_mas_votados.png')
display(i)
En la siguiente tabla muestra los promedios porcentuales de votación de los conceptos menos votados por region. La varianza, en algunos casos, puede llegar $20\%$ (como en el caso de Pluralismo), pero aún asi, como se trata de números pequeños, en realidad no es mucho lo que varía por región.
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/conceptos_menos_votados.png'))
A continuación se presentan los gráficos de las distribuciones porcentuales de votación de algunos conceptos del grupo de los más votados, menos votados, y algunos que no pertenecen a esta categoría (más larga la barra significa más votado). La tendencia general es que la distribución por región se mantiene bastante uniforme, con alguna que otra excepción, por ejemplo, en las regiones de Tarapacá y Antofagasta el concepto de Justicia ronda el 50% (cota superior), mientras que en la región de Aysen ronda el 40% (cota inferior).
En cuanto al caso de Amistad Cívica, cuya votación no supera el 10%, lo principal que se puede aprender es que en toda región no fue un concepto popular.
Un caso especial es de Descentralización, en donde notoriamente tiene menor votación en Santiago (25%), versus alrededor del 50% que tiene en la región de Magallanes, pero esto es un caso aislado.
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/justicia.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/amistad_civica.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/descentralizacion.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/equidad_de_genero.png'))
Se realizó un histograma de la distribución de edades de los participantes a nivel nacional, cuyos resultados se muestran a continuación
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel("/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/data/Resultado_Consultas_Individuales.xlsx")
data = df.fillna(0).values
votos = np.nan_to_num(data[:, 6:-2])
edades = np.array(data[:,4], dtype='float64')
fig = plt.figure(figsize = (20,10))
plt.hist(edades,bins = 163)
plt.xlabel("Edad", fontsize=20)
plt.ylabel("Frecuencia", fontsize=20)
plt.title('Histograma de Edades de los Participantes', fontsize=25)
plt.show()
Se puede observar que el rango etáreo que más participantes tuvo es el de los 25 a los 35 años, y a medida que aumenta la edad, el va disminuyendo número de participantes También se realizaron histogramas de edades en cada región del país y se encontró que la distrubución de participantes individuales, en cada región no varían demasiado en cuanto a la distribución a nivel nacional, por lo que no se adjuntan en este informe.
Se realizó un experimento de reducción de dimensionalidad a dos dimensiones utilizando el algotirmo T-distributed Stochastic Neighbor Embedding (t-SNE) con el objetivo se tener una vista de los datos que permita observar si existe algún tipo de estructura en ellos. La siguiente figura muestra las consultas en un espacio de dos dimensiones y se puede ver a simple vista que existe estructura en los datos ¿Cómo son?
from sklearn.manifold import TSNE
#X = TSNE(n_components=2).fit_transform(votos)
X=np.load('TSNE.npy')
fig = plt.figure(figsize=(20,10))
plt.scatter(X[:,0], X[:,1], alpha=0.05, marker='o')
plt.title('Vista de datos en un Espacio de 2 Dimensiones', fontsize=20)
plt.show()
Se realizó un experimento de clustering para encontrar las estructuras de datos que, del experimento 2.1 utilizando el algoritmo k-means.
Se realizó un experimento de clustering sobre los datos en 2 dimensiones buscando captar la estructura encontrada en la figura anteior. Para la determinación del número de clusters, se utilizó el método del codo la métrica de suma de distancias cuadradas, lo que se ve en la figura a continuación:
from sklearn.cluster import KMeans
clust = 30 # graficaremos hasta 30 clusters
sums = np.zeros(clust)
sums2 = np.zeros(clust)
for i in range(clust):
sums[i] = KMeans(n_clusters=i+1, random_state=0).fit(X).inertia_
sums2[i] = KMeans(n_clusters=i+1, random_state=0).fit(votos).inertia_
fig = plt.figure(figsize=(10,5))
plt.plot(np.arange(clust)+1, sums, marker='o')
plt.title('Suma de distancias Cuadradas Datos en 2D', fontsize=20)
plt.xlabel("num de clusters", fontsize=15)
plt.ylabel("suma de distancias cuadradas", fontsize=15)
plt.show()
En base a la figura anterior se eligió $k=6$, pero el resultado no obedece a la estructura observada, ni con k-means ni con otros algoritmos, por lo que se esta se descartó esta aproximación. La siguiente figura muestra que los datos simplemente se dividieron en en partes iguales.
kmeans = KMeans(n_clusters=6, random_state=0).fit(X)
fig = plt.figure(figsize=(10,10))
plt.scatter(X[:,0], X[:,1], marker='o', c=kmeans.labels_)
plt.title('Distribución de clusters sobre los datos en 2D', fontsize=20)
plt.show()
Se optó por repetir el experimento con los datos crudos y, al igual que en la sección anterior, se utilizó el método del codo para encontrar el valor de $k$.
fig = plt.figure(figsize=(10,5))
plt.plot(np.arange(clust)+1, sums2, marker='o')
plt.title('Suma de distancias Cuadradas Datos Crudos', fontsize=20)
plt.title('Suma de distancias Cuadradas Datos en 2D', fontsize=20)
plt.xlabel("num de clusters", fontsize=15)
plt.ylabel("suma de distancias cuadradas", fontsize=15)
plt.show()
Aquí es más difícil determinar el valor de $k$, pero se elige $k=5$ ya que es donde disminuye considerablemente la pendiente de la gráfica.
Los $5$ clusters obtenidos eran el mismo tamaño, y dividieron los datos según las siguientes características:
*Gran parte de los que votaron Estado de derecho, también lo hicieron por Justicia y Democracia (Cluster 5).
*Gran parte de los que votaron Democracia, también lo hicieron por Justicia (Cluster 2).
*Una parte de los que votaron Justicia no votó por Democracia (Cluster 1).
*Hubo un grupo importante que no votó por Justicia ni Democracia ni Descentralización (Cluster 4).
*Buena parte de los que votaron medio ambiente, también lo hicieron por descentralización (Cluster 3).
Los clusters en general entregan información de los conceptos que más fueron votados en general. De los clusters se concluye que, en general la votación de Justicia, Democracia y Estado de Derecho estuvieron presentes en la discusión con gran votación y tuvieron una buena parte de la votación, y quienes no votaron por Justicia tampoco lo hicieron por Democracia (ni respeto por el medio ambiente). Esto sugiere que la estructura de la votación es aglomerativa, estando en el tope de Esta Justicia (el más votado), pero al intentar hacer el experimento, este falló por haber demasiados datos.
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/cluster1.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/cluster2.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/cluster3.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/cluster4.png'))
display(Image(filename='/Users/arielbarraza/Documents/Cursos/2019_01/CC5206/Proyecto/hito3/cluster5.png'))
Para el análisis por edad, se implementó el siguiente código en donde como ya se mencionó previamente se dividió el en 5 grupos estarios, y se realizaron reglas de asociación utilizando el algorítmo Apriori.
import csv
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from importlib import reload
from sklearn.datasets import fetch_mldata
import seaborn as sns; sns.set(style="ticks", color_codes=True)
import pyfpgrowth
from mlxtend.frequent_patterns import apriori
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import association_rules
import sys
if sys.version[0] == '2':
reload(sys)
sys.setdefaultencoding("utf-8")
df = pd.read_excel("p1.xlsx")
data = df.fillna(0).values
#votos y edad
votos = np.nan_to_num(data[:, 4:-2])
#lista de regiones
regiones = np.unique(df['Región'].values)
N_regiones = len(regiones)
data_region = data[:,0]
#reemplazar regiones en el dataset
for region in regiones:
data[data == region] = np.where(regiones == region)[0][0]
# para volver a obtener el nombre de la region tipear
# regiones[index], donde index es el valor de la columna region
respuestas=['Amistad civica','Autonomia/Libertad','Bien comun/Comunidad','Ciudadania','Democracia','Desarrollo','Descentralizacion','Dignidad','Diversidad','Emprendimiento Libre','Equidad de Genero','Respeto/conservacion de la naturaleza o medio ambiente','Estado de Derecho','Identidad cultural','Igualdad','Inclusion','Innovacion/creatividad','Integracion' ,'Justicia','Estado laico','Multiculturalidad','Participacion','Patriotismo','Paz/convivenciaPacifica','Pluralismo','Plurinacionalismo','Probidad','Republica','Respeto','Responsabilidad','Seguridad','Soberania','Solidaridad','Subsidiaridad','Tolerancia','Transparencia y publicidad','unidad']
#grupos de edad y valores binarios
grupo1=[]
grupo2=[]
grupo3=[]
grupo4=[]
grupo5=[]
for i in votos:
if i[0]<=19:
grupo1.append(i[1:])
if i[0]>=20 and i[0]<=29:
grupo2.append(i[1:])
if i[0]>=30 and i[0]<=39:
grupo3.append(i[1:])
if i[0]>=40 and i[0]<=59:
grupo4.append(i[1:])
if i[0]>=60:
grupo5.append(i[1:])
#grupos de edades con palabras
grup1 = []
grup2 = []
grup3 = []
grup4 = []
grup5 = []
for i in range(len(grupo1)):
grup1.append([])
for j in range(37):
if grupo1[i][j]==1:
grup1[i].append(respuestas[j])
else: None
####
for i in range(len(grupo2)):
grup2.append([])
for j in range(37):
if grupo2[i][j]==1:
grup2[i].append(respuestas[j])
else: None
####
for i in range(len(grupo3)):
grup3.append([])
for j in range(37):
if grupo3[i][j]==1:
grup3[i].append(respuestas[j])
else: None
####
for i in range(len(grupo4)):
grup4.append([])
for j in range(37):
if grupo4[i][j]==1:
grup4[i].append(respuestas[j])
else: None
####
for i in range(len(grupo5)):
grup5.append([])
for j in range(37):
if grupo5[i][j]==1:
grup5[i].append(respuestas[j])
else: None
####
te = TransactionEncoder()
#grupo 1
g1= te.fit(grup1).transform( grup1)
df1 = pd.DataFrame(g1, columns=te.columns_)
g2= te.fit(grup2).transform( grup2)
df2 = pd.DataFrame(g2, columns=te.columns_)
g3= te.fit(grup3).transform( grup3)
df3 = pd.DataFrame(g3, columns=te.columns_)
g4= te.fit(grup4).transform( grup4)
df4 = pd.DataFrame(g4, columns=te.columns_)
#grupo5
g5 = te.fit(grup5).transform( grup5)
df = pd.DataFrame(g5, columns=te.columns_)
frequent_itemsets = apriori(df, min_support=0.02, use_colnames=True)
reg1= association_rules(frequent_itemsets, metric="lift", min_threshold=1)
reg1[ (reg1['lift'] >= 6) &(reg1['confidence'] >= 0.5) ]
reg1.sort_values(['lift'], ascending=[False])
f2= apriori(df1, min_support=0.02, use_colnames=True)
reg2 = association_rules(f2, metric="lift", min_threshold=1)
reg2[ (reg2['lift'] >= 6) &(reg2['confidence'] >= 0.5) ]
reg2.sort_values(['lift','confidence'], ascending=[False, True])
f3= apriori(df2, min_support=0.02, use_colnames=True)
reg3= association_rules(f3, metric="lift", min_threshold=1)
reg3[ (reg3['lift'] >= 6) &(reg3['confidence'] >= 0.5) ]
reg3.sort_values(['lift','confidence'], ascending=[False, True])
f4 = apriori(df3, min_support=0.02, use_colnames=True)
reg4= association_rules(f4, metric="lift", min_threshold=1)
reg4[ (reg4['lift'] >= 6) &(reg4['confidence'] >= 0.5) ]
reg4.sort_values(['lift','confidence'], ascending=[False, True])
f5= apriori(df4, min_support=0.02, use_colnames=True)
reg5= association_rules(f5, metric="lift", min_threshold=1)
reg5[ (reg5['lift'] >= 6) &(reg5['confidence'] >= 0.5) ]
reg5.sort_values(['lift','confidence'], ascending=[False, True])
Para las reglas de asociación se utilizaron dos algoritmos distintos para genera itemsets y luego reglas. Primero se comenzó con el algoritmo Fp-growth debido a su mayor rapidez en comparación al algoritmo Apriori. No obstante, la librería utilizada para realizar el algoritmo Fp-grwth entregaba los resultados de una manera muy desordenas, lo cual hacia bastante difícil la evaluación de estos mismos. Además, no fue posible encontrar una librería de Python que utilizara el algoritmo Fp-growth y entregara todas las métricas importantes de las reglas de asociación, a saber, support, lift y conffidence. Por esto ultimo, se decidió realizar nuevamente las pruebas con el algoritmo Apriori, y agregar algún de las sugerencias que fueron hechas el día de la presentación, esto es, analizar nuevamente los resultados por región, particularmente para las regiones metropolitana, del Biobío y Araucanía.
Ahora, analizando los distintos rangos de edades nuevamente, pero ahora con el algoritmo Apriori y ordenados por un lift descendente, se tiene lo siguiente para los distintos rangos de edades:
-Edad <19: Para este rango de edad es posible observar que hay reglas que poseen un alto lift y conffidence. NO obstante, analizando un poco las reglas que se generan, casi todas poseen los mismos elementos, esto es, las cosas que más se votaron juntas y que poseen una mayor probabilidad de que se haya votado una sabiendo que las otras se botaron, fueron los conceptos de Autonomía, libertad, democracia, subsidiaridad, estado de derecho y emprendimiento libre. Se nombran los conceptos y no sus reglas debido a que se generan muchas reglas que son redundantes entre los conceptos ya mencionados, poseyendo todas (reglas) una alto lift (10<) y una confianza sobre el 70%.
-20<Edad <29: En este grupo las métricas emporan bastante, desde el pugno de vista del lift como del conffidence. Es posible observar que al ordenar las reglas por lift, las únicas reglas que tienen métricas un tanto confiables son d emprendimiento libre y autonomía. Además aparecen nuevos conceptos y reglas con cierto grado de optimalidad, que son equidad de genero, estado laico y conservación de la naturaleza. Y a su ves, los conceptos de solidaridad, seguridad y respeto.
-30<Edad <39: Se mantienen conceptos y reglas parecidas al del grupo anterior, pero surgen otras con métricas elativamente buenas, como lo son desarrollo justicia y seguridad, y también, plurinacionalismo y estado laico.
-40<Edad <59: Se obtienen reglas y resultados similares a los dos grupos anteriores.
-60<Edad : Similar a los grupos anteriores, en donde algunas métricas mejoran para ciertas reglas como por ejemplo autonomía, estado de derecho y subsidiaridad.
Cabe mencionar que el código por zona geográfica se adjunta en anexos como comentario dada su longitud y costo computacional. Ahora, observando los resultados obtenidos por zona geográfica, esto es, por regiones, particularmente se trabajo con la región de la Araucanía, metropolitana, Biobío y Valparaíso. Además, como fue sugerido en la presentación, se realizo un análisis en particular por comunas de la región metropolitana, cuyos resultados se procederían a analizar. Primero en cuanto a los resultados obtenidos por comunas de la región metropolitana, se puede observa que las reglas generadas, al igual que por rangos de edad, las que alcanzan mejores métricas en cuanto a confianza y lift, tienden a estar conformadas por los conceptos mas botados. No obstante, tal como se sugirió el día de la presentación, si surgen reglas que no son posibles ver en todas las comunas, en donde, en comunas del sector oriente, tales como Vitacura o Los condes, hay conceptos que no aparecen en reglas de comunas de ingreso per cápita mas bajo. Finalmente, en cuanto a los resultados por regiones, se tiene que al igual que para los casos anteriores las reglas con mejores métricas, tienden a estar conformadas por los conceptos más votados. Aunque cabe mencionar que si surgen reglas con un lift cercano a 4 y conffidence del orden 30%, que son distintivas para ciertas regiones, particularmente para la Araucanía.
De lo anterior, es posible concluir que las reglas de asociación encontradas por zona geográfica con mejores métricas tienden a estar conformadas por los conceptos más votados, no obstante, si surgen ciertas diferenciaciones principalmente por zona geográfica, ya sea por comuna y para algunas regiones. Por otro lado, por rango etario no se encontraron reglas que fueran características de ciertos grupos, sino que más bien, todos los grupos tendían a generar reglas conformadas por los conceptos más votados, lo cual se puede deber quizá a que la discusión en los cabildos se centro en dichos conceptos.
En cuanto a los clusterings se encontraron relaciones entre Justicia, Democracia y Estado de Derecho.
No se encontró evidencia de que la varaible edad fuera relevante en la votación.
La estructura de los datos es aglomerativa y existen más relaciones que podrían aparecer aumentando el valor de k en k-means.